
import store from '@/store'
import axios from 'axios'
import { Message } from 'element-ui'
import router from '@/router'
// 引入element-ui的Loading方法
import { Loading } from 'element-ui'
// create an axios instance
// 通过创建axios实例的方法来配请求基础路径和请求超时，有一个好处就是
// 当我们的项目中需要用到多个基础路径时，可以创建多个实例，配置多个基础路径
// 封装接口函数的时候就可以根据需求选择引入不同的axios实例进行使用
const service = axios.create({
  // 配置请求基地址
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  // 配置请求超时时间
  timeout: 50000 // request timeout  单位是毫秒
})
const time = 24 * 60 * 60 * 1000 // token失效时间 1天
// 声明一个loading
let loading = ''
// export const service2 = axios.create({
//   // 配置第二个请求基地址
//   baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
//   // withCredentials: true, // send cookies when cross-domain requests
//   // 配置请求超时时间
//   timeout: 50000 // request timeout  单位是毫秒
// })

// request interceptor
//  请求拦截
service.interceptors.request.use(config => {
  //  请求拦截，统一设置token
  const token = store.state.user.token
  // 调用element-ui提供的Loading.service
  loading = Loading.service({
    lock: true,
    text: 'Loading',
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.7)'
  })
  if (token) {
    const loginTime = localStorage.getItem('loginTime')
    const curTime = Date.now()
    const dir = curTime - loginTime
    if (dir > time) {
      //  退出登录
      store.dispatch('user/logout')
      //  跳转至登录页
      router.push('/login')
      // 报错信息 return结束请求
      return Promise.reject(new Error('登录超时'))
    }

    //  设置token
    config.headers.Authorization = 'Bearer ' + token
  }
  //  请求放行
  return config
}, err => {
  return Promise.reject(err)
})

// 响应拦截
// （网络层面的失败） 请求的接口路径写错了，那么就会发生网站层面的失败
// (数据层面的失败) 登录接口的账号密码写错了，就会发生数据层面的失败

service.interceptors.response.use(res => {
  console.log('网络层面成功', res)
  const { data, message, success } = res.data
  if (success) {
    // 判断get请求以及获取用户基础资料不需要显示提示语
    if (res.config.method === 'post' && res.config.url !== '/api/sys/profile') {
      Message({
        type: 'success',
        message: message
      })
    }
    // 关闭加载效果
    loading.close()
    return data
  } else {
    //  数据层面的错误处理
    Message({
      type: 'error',
      message: message
    })
    //  Promise.reject是一个错误对象，可以使得我们请求出错的时候
    //  能够在控制台中输入错误信息
    //  Error是元素js错误构造函数，我们可以利用error构造函数结合
    //  Promise.reject把错误信息的位置更加精确的输出在控制台中
    return Promise.reject(new Error(message))
  }

  // return res
}, err => {
  console.log('网络层面失败', err)
  //  弹出信息，提示失败信息
  console.dir(err)
  // 关闭加载效果
  loading.close()
  // 当code的状态码为 10002时
  if (err.response && err.response.data.code === 10002) {
    // 退出登录
    store.dispatch('user/logout')
    // 退出到登录页面
    router.push('/login')
  }
  // 显示提示
  Message({
    type: 'error',
    message: err.response.data.message + '--后端设置过期时间'
  })
  //  把错误信息返回axios，这个axios接到了就会被catch捕获到
  return Promise.reject(err.response.data.message)
})
export default service
